package com.example.mytk2_6;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import java.io.DataInputStream;
import java.io.IOException;
import java.net.Socket;

public class MainActivity extends AppCompatActivity   {
    TextView tv_state;//用于显示连接状态的文本框，包括：已连接和网络断开 2种状态
    EditText ip_edit; //用于引用IP地址编辑框
    EditText ip_port; //用于引用端口号编辑框
    Button bt_connect;//用于引用连接按钮
    Button bt_close;//用于引用关闭按钮

    EditText rq_edit;//用于引用入侵状态辑框
    EditText address_edit;//用于引用入侵地点编辑框
    EditText time_edit;//用于引用入侵时间编辑框
    String ip;  //用于存储IP地址
    int port;  //用于存储端口号
    Socket ss;  //网络通信使用的Socket

    DataInputStream dataInputStream;  //网络通信使用的数据输入流
    byte buff[]=new byte[20]; //定义一个缓冲区，用于保存网络接收数据
    int  rq=0;  //接收的入侵状态
    int  time[]=new int[4];   //接收的入侵时间,time[0]保存日,time[1]保存时,time[2]保存分,time[3]保存秒
    int address=-1; //入侵地点编码

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        tv_state=(TextView)this.findViewById(R.id.tv_state);
        //任务3_1 ：根据组件id号R.id.ip_edit查找IP地址编辑框EditText组件的引用，使用变量ip_edit保存

        ip_edit = findViewById(R.id.ip_edit);

        //结束任务3_1
        ip_port=(EditText)this.findViewById(R.id.ip_port);

        bt_connect=(Button)this.findViewById(R.id.bt_connect);
        bt_close=(Button)this.findViewById(R.id.bt_close);

        rq_edit=(EditText)this.findViewById(R.id.edit_rq);
        address_edit=(EditText)this.findViewById(R.id.edit_address);
        time_edit=(EditText)this.findViewById(R.id.edit_time);

        bt_connect.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {

                //任务3_2 ：从IP地址编辑框ip_edit获取IP地址并保存到变量ip

                ip = ip_edit.getText().toString().trim();

                //结束任务3_2

                port= Integer.parseInt(ip_port.getText().toString().trim());

                startThread();
            }
        });

        bt_close.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                try {
                    ss.close();
                    tv_state.setText("网络断开");
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

    }

    void startThread()
    {
        new Thread(new Runnable(){
            @Override
            public void run() {
                //连接网路，如果不产生异常，说明连接成功，设置tv_state文本为已连接
                try {
                    //任务3_3 ：实现建立Socket网络连接，使用变量ss保存

                    ss = new Socket(ip,port);


                    //结束任务3_3

                    //数据输入流DataInputStream
                    dataInputStream=new DataInputStream(ss.getInputStream());


                    MainActivity.this.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {

                            //任务3_4 ：实现文本框tv_state显示为"已连接"状态

                            tv_state.setText("已连接！");

                            //结束任务3_4
                        }

                    });

                } catch (IOException e) {
                    e.printStackTrace();
                }
                //循环接收数据，  解析和显示
                while(ss!=null && !ss.isClosed())
                {
                    try {
                        //网络接收数据，保存到buff
                        int len=dataInputStream.read(buff);

                        //如果接收的数据不符合通信协议，即不符合上传数据的数据结构，放弃不做任何处理，等待接收下一个数据；
                        if(len!=8 || buff[0]!=(byte)0x55 || buff[1]!=(byte)0xAA )  continue;

                        //根据通信协议提取数据
                        if(buff[3]==(byte)0x0F)  //入侵类型
                        {
                            //byte转换成int,部分编译器会把最高位当做符号位，因此写成0x0FF
                            //根据通信协议提取入侵时间,入侵时间数据保存到数组time[]
                            time[0]=0x0FF & buff[4]; //提取入侵 日
                            time[1]=0x0FF & buff[5]; //提取入侵 时
                            time[2]=0x0FF & buff[6]; //提取入侵 分
                            time[3]=0x0FF & buff[7]; //提取入侵 秒

                            //任务3_5 ：根据通信协议提取入侵地址编号,入侵地址数据保存到变量address

                            address = 0x0FF & buff[2];

                            //结束任务3_5
                        }

                        //数据更新到UI界面：
                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                if(time[0]==0 && time[1]==0 && time[2]==0 && time[3]==0 ) //没有入侵
                                {
                                    rq_edit.setText("无入侵");// rq_edit 用于引用入侵状态辑框
                                    address_edit.setText("");// address_edit 用于引用入侵地点编辑框
                                    time_edit.setText("");// time_edit 用于引用入侵时间编辑框
                                }
                                else {  //有入侵
                                    rq_edit.setText("入侵");  //显示入侵状态
                                    switch(address)   //显示入侵地点
                                    {
                                        case 0:
                                            address_edit.setText("东门");
                                            break;
                                        case 1:
                                            address_edit.setText("南门");
                                            break;
                                        case 2:
                                            address_edit.setText("北门");
                                            break;
                                        case 3:
                                            address_edit.setText("西门");
                                            break;
                                    }


                                    //任务3_6 ：实现显示显示入侵时间，显示入侵时间显示编辑框是 edit_time;
                                    //数组int  time[]保存入侵时间；time[0]保存日,time[1]保存时,time[2]保存分,time[3]保存秒
                                    time_edit.setText("时间为：" + time[0] + "日 "+ time[1] + "时 " + time[2] + "分 " + time[3] + "秒");

                                    //结束任务3_6
                                }

                            }
                        });


                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }


            }
        }).start();
    }

}